//
//  Status.swift
//  WeiBoSwift
//
//  Created by rong on 15/6/30.
//  Copyright © 2015年 rong. All rights reserved.
//

import UIKit
import SDWebImage

/*
    since_id	false	int64	若指定此参数，则返回ID比since_id大的微博（即比since_id时间晚的微博），默认为0。
    max_id	    false	int64	若指定此参数，则返回ID小于或等于max_id的微博，默认为0。

    since_id  返回比它时间晚的微博： 下拉刷新
    max_id    返回时间比他早的微博： 上拉刷新

    越新的微博 的 ID 越大
    越老的微博 的 ID 越小
*/

//访问微博的首页   ：  获取登录用户以及所关注用户的最新微博
private let WB_Home_Timeline_URL = "2/statuses/home_timeline.json"

class Status: NSObject {

    //数据模型属性
    var created_at: String?
    
    //微博ID
    var id: Int = 0
    
    //微博信息内容
    var text: String?
    
    //微博来源
    var source: String? {
        didSet{
            if let result = source?.hrefLink() {
                source = result.text
            }
        }
    }
    
    //配图数组
    var pic_urls: [[String: String]]? {
    
        didSet{
            
            imageURLs = [NSURL]()
            largeImageURLs = [NSURL]()
            
            for dict in pic_urls! {
                
                var strUrl = dict["thumbnail_pic"]!
                imageURLs?.append(NSURL(string: strUrl)!)
                
                strUrl = strUrl.stringByReplacingOccurrencesOfString("thumbnail", withString: "large")
                largeImageURLs?.append(NSURL(string: strUrl)!)
            }
        }
    }

    //被转发的源微博信息自段，当该微博为转发时会返回这个
    var retweeted_status: Status?
    
    //配图的 URL 数组(自己为了方便添加的，不是返回数据中的，保存pic_urls中的url)
    private var imageURLs: [NSURL]?
    //新添加的配图urls 数组
    var picURLs: [NSURL]? {
        return retweeted_status != nil ? retweeted_status?.imageURLs : imageURLs
    }
    
    
    //大图的  URL  数组
    private var largeImageURLs: [NSURL]?
    var largePicUrls: [NSURL]? {
        return retweeted_status != nil ? retweeted_status?.largeImageURLs : largeImageURLs
    }
    
    //用户模型
    var user: User?
    
    //类属性数组
    static let properties = ["created_at", "id", "text", "source", "pic_urls", "user", "retweeted_status"]//！！！一开始少了"pic_urls",就不能执行他的didset方法
    
    //调试打印信息
    override var description: String {
        let dict = dictionaryWithValuesForKeys(Status.properties)
        
        return "\(dict)"
    }
    
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {
        
    }
    
    override func setValue(value: AnyObject?, forKey key: String) {
        if key == "user" {
        
            if let userDict = value as? [String: AnyObject] {
                
                user = User(dict: userDict)
            }
            return
        }
        
        if key == "retweeted_status" {
        
            //判断字典中是否包含 retweeted_status
            if let retweetedDict = value as? [String: AnyObject] {
                retweeted_status = Status(dict: retweetedDict)
            }
            return
        }
        
        super.setValue(value, forKey: key)
        
    }
    
    //初始化方法
    init(dict: [String: AnyObject]) {
        super.init()
        
        setValuesForKeysWithDictionary(dict)
        
        /*for key in Status.properties {
            
            if dict[key] == nil || key == "user" || key == "retweeted_status"{
                continue
            }
            
            //使用 kvc 设置数值， 使用之前需要调用 super.init  初始化对象属性
            setValue(dict[key], forKey: key)
        }
        
        //判断字典中是否包含 user
        if let userDict = dict["user"] as? [String: AnyObject] {
        
            user = User(dict: userDict)
        }
        
        //判断字典中是否包含 retweeted_status
        if let retweetedDict = dict["retweeted_status"] as? [String: AnyObject] {
            retweeted_status = Status(dict: retweetedDict)
        }*/
        
    }
    
    ///  加载数据
    /**
    since_id    若指定此参数，则返回ID比since_id大的微博（即比since_id时间晚的微博），默认为0
    max_id      若指定此参数，则返回ID小于或等于max_id的微博，默认为0
    */
    
    // 微博上拉刷新 的 “bug” : 如果网速不好，滑到最后一个cell时， 如果没有加载出来，此时往回滑，再往下拉，就会出现重复加载
    // 解决方法： 加一个  正在加载数据标记
    private static var isLoadingData = false
    //加载数据
    class func loadStatus(since_id: Int, max_id: Int, finished: (statues: [Status]?, error: NSError?) -> ()){
        
        //发起网络请求
        NetworkTools.sharedNetworkTools().loadStatus(since_id, max_id: max_id) { (array, error) -> () in
            if error != nil {
                finished(statues: nil, error: error)
                return
            }
            
            if array == nil {
                finished(statues: nil, error: nil)
                return
            }
            
            //获得微博的模型数组
            let list = statuses(array!)
            
            //这里面是异步缓存，所有有可能这里没执行完，就去界面布局回调block（finished）
            //应该是先缓存完所有图片对象后，再去 通知 布局界面，如果没有下载完，就不知道图像宽高，没法布局界面
            cacheWebImages(list, finished: finished)
        }
    
       /* assert(sharedUserAccount != nil, "Status:loadStatus ==> 必须登录之后才能访问网络")
        
        if isLoadingData {
            
            print("正在加载数据...")
            return
        }
        
        var params = ["access_token": sharedUserAccount!.access_token]
        
        if since_id > 0 {
            params["since_id"] = "\(since_id)"
        }
        
        //!!!!! since_id 和 max_id 不能同时为 0
        if max_id > 0 {
            params["since_id"] = "0"
            params["max_id"] = "\(max_id - 1)"
        }
        
        isLoadingData = true
        
        //发起网络请求，异步加载数据
        NetworkTools.sharedNetworkTools().GET(WB_Home_Timeline_URL, parameters: params, success: { (_, JSON) -> Void in
            
            self.isLoadingData = false
            
            //从结果中获取的模型数组
            if let array = JSON["statuses"] as? [[String: AnyObject]] {
            
                //获得微博的模型数组
                let list = statuses(array)
                
                //这里面是异步缓存，所有有可能这里没执行完，就去界面布局回调block（finished）
                //应该是先缓存完所有图片对象后，再去 通知 布局界面，如果没有下载完，就不知道图像宽高，没法布局界面
                cacheWebImages(list, finished: finished)
                
                // array就是拿到的微博数组，直接回调返回
                //finished(statues: list)
                
                return
            }
            
            //空数据，解析失败或者其他原因
            finished(statues: nil, error: nil)
            
            }) { (_, error) -> Void in
              
                self.isLoadingData = false
                
                print(error)
                
                //回调通知错误
                finished(statues: nil, error: error)
         }*/
    
    }
    
    
    //传入字典数组，返回status模型数组
    private class func statuses(array: [[String: AnyObject]]) -> [Status] {
        
        //可变数组
        var arrayM = [Status]()
        
        //遍历 array
        for dict in array {
        
            arrayM.append(Status(dict: dict))
        }
        print("cecececece")
        print(arrayM)
        
        return arrayM
    
    }
    
    //缓存微博数组中的所有图像
    // 目前要解决的问题：   等所有图片都缓存完成后，统一进行回调
    private class func cacheWebImages(list: [Status], finished: (statues: [Status]?, error: NSError?) -> ()) {
    
        //调度组
        let group = dispatch_group_create()
        
        //1.遍历数组
        for status in list {
            //2.判断 imageURLs 是否有内容
            if status.picURLs == nil || status.picURLs!.isEmpty {
                continue
            }
            
            //print(status.imageURLs)
            
            //遍历 数组 imageURLs
            
            for url in status.picURLs! {
                
                dispatch_group_enter(group)
            
                SDWebImageManager.sharedManager().downloadImageWithURL(url, options: SDWebImageOptions(rawValue: 0), progress: nil, completed: { (_, _, _, _, _) -> Void in
                    
                    //图片缓存完成
                    //print(NSHomeDirectory())
                    
                    dispatch_group_leave(group)
                })
            }
        }
        
        //最后执行
        dispatch_group_notify(group, dispatch_get_main_queue()) { () -> Void in
            //完成回调
            finished(statues: list, error: nil)
        }
    }
    
    
}
